package com.shujia.day17;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Code03GetConstruct {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        /*

            newInstance:
                通过构造器对象获取其类的对象,传入的参数是类的构造函数参数

            getDeclaredConstructor:
                忽略权限获取构造器 但是构造在做实例化之前需要通过构造器的 setAccessible 方法对私有的构造方法设置其权限

         */


        // 1.通过反射的方式获取 Student类中的 类对象

        Class<?> stuObj = Class.forName("com.shujia.day17.Student");

        // 2.如果要创建学生对象，那么需要获取其构造方法，通过构造方法的使用，再去创建其对象

        /*
            getConstructors 可以获取到类对象中所有的构造方法
                public com.shujia.day17.Student(java.lang.String,int)
                public com.shujia.day17.Student()

            其返回结果的每个元素都是一个构造器对象,该方法只能获取到其中public修饰的构造方法
         */

//        Constructor<?>[] constructors = stuObj.getConstructors();
//        for (Constructor<?> constructor : constructors) {
//            System.out.println(constructor);
//        }

        // 需求：获取参数为String类型的构造器对象

        // 传入Class
        Constructor<?> constructor = stuObj.getConstructor(String.class);

        System.out.println(constructor); // 打印构造器对象

        Object stu = constructor.newInstance("张东东");
        System.out.println(stu);


        // 需求：获取私有的构造方法

        // 可以绕过构造方法的权限，获取其构造器

        Constructor<?> declaredConstructor = stuObj.getDeclaredConstructor();
        declaredConstructor.setAccessible(true);
        Object o = declaredConstructor.newInstance();
        System.out.println(o);


    }
}
